home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / t_os / helper / source / keyword.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-07-08  |  19.5 KB  |  797 lines

  1. /*
  2.     KEYWORD.C
  3.  
  4.     1991.01.11  make by Ken
  5. */
  6. #include    <stdio.h>
  7. #include    <stdlib.h>
  8. #include    <string.h>
  9. #include    <ctype.h>
  10. #include    <mos.h>
  11. #include    "scrn.h"
  12. #include    "keyword.h"
  13. #include    "graphic.h"
  14. #include    "dir.h"
  15. #include    "file.h"
  16. #include    "event.h"
  17. #include    "coldef.h"
  18.  
  19. #define    TRUE    1
  20. #define    FALSE    0
  21. #define    ERR    (-1)
  22.  
  23. #define KEY_HAS     8
  24.  
  25.        int    prg_max=0;
  26.        int    key_max=0;
  27.        int    prg_cnt=0;
  28.        int    prg_hit=0;
  29.        int      prg_ofs=0;
  30.        char    *crent_drive=NULL;
  31.        PRGPTR    *prg_top=NULL;
  32. static PRGPTR    *prg_btm=NULL;
  33. static KEYPTR    *key_now=NULL;
  34.        KEYPTR   *key_tbl[KEY_MAX];
  35. static KEYPTR   *key_hash[KEY_HAS]={
  36.             NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL };
  37.        PRGPTR    *prg_tbl[PRG_MAX];
  38.  
  39. char    *strdup(char *str)
  40. {
  41.     char    *p;
  42.  
  43.     if ( (p = (char *)malloc(strlen(str)+1)) != NULL )
  44.     strcpy(p,str);
  45.     return p;
  46. }
  47. static int  hash_calc(char *str)
  48. {
  49.     int     hs=0;
  50.  
  51.     while ( *str != '\0' )
  52.         hs = hs * 31 + *(str++);
  53.     return (hs & (KEY_HAS-1));
  54. }
  55. static KEYPTR *key_srch(char *key)
  56. {
  57.     int     hs;
  58.     KEYPTR  *kp;
  59.  
  60.     hs = hash_calc(key);
  61.     kp = key_hash[hs];
  62.     while ( kp != NULL ) {
  63.         if ( strcmp(key,kp->key) == 0 )
  64.         return kp;
  65.         kp = kp->next;
  66.     }
  67.  
  68.     if ( (kp = (KEYPTR *)malloc(sizeof(KEYPTR))) == NULL )
  69.         return NULL;
  70.  
  71.     kp->next = key_hash[hs];
  72.     key_hash[hs] = kp;
  73.  
  74.     kp->key = strdup(key);
  75.     kp->flg = kp->cnt = 0;
  76.     kp->over = kp->grop = NULL;
  77.  
  78.     return kp;
  79. }
  80. static void key_set(char *key,PRGPTR *pp)
  81. {
  82.     int     i,hs;
  83.     KEYPTR  *kp;
  84.  
  85.     hs = hash_calc(key);
  86.     kp = key_hash[hs];
  87.     while ( kp != NULL ) {
  88.         if ( strcmp(key,kp->key) == 0 ) {
  89.         key_now = kp;
  90.         if ( kp->grop != NULL )
  91.         kp = kp->grop;
  92.             while ( kp->cnt >= PRG_QUE ) {
  93.         for ( i = 0 ; i < kp->cnt ; i++ ) {
  94.             if ( kp->prog[i] == pp )
  95.             return;
  96.         }
  97.                 if ( kp->over == NULL ) {
  98.                     if ( (kp->over =
  99.                          (KEYPTR *)malloc(sizeof(KEYPTR))) == NULL )
  100.                         return;
  101.                     kp = kp->over;
  102.             kp->cnt = 0;
  103.             kp->over = NULL;
  104.                 } else
  105.                     kp = kp->over;
  106.             }
  107.             goto ENDOF;
  108.         }
  109.         kp = kp->next;
  110.     }
  111.  
  112.     if ( (kp = (KEYPTR *)malloc(sizeof(KEYPTR))) == NULL )
  113.         return;
  114.  
  115.     kp->next = key_hash[hs];
  116.     key_hash[hs] = kp;
  117.  
  118.     kp->key = strdup(key);
  119.     kp->flg = kp->cnt = 0;
  120.     kp->over = kp->grop = NULL;
  121.     key_now = kp;
  122.  
  123.     if ( key_max < KEY_MAX ) {
  124.     KEY_putstr(key_max,kp->key);
  125.     key_tbl[key_max++] = kp;
  126.     }
  127.  
  128. ENDOF:
  129.     if ( pp != NULL ) {
  130.     for ( i = 0 ; i < kp->cnt ; i++ ) {
  131.         if ( kp->prog[i] == pp )
  132.         return;
  133.     }
  134.     kp->prog[kp->cnt++] = pp;
  135.     }
  136. }
  137. static    char    *chk_drv(char *dir)
  138. {
  139.     static char tmp[BUFSIZ];
  140.  
  141.     if ( dir[0] != '\0' && dir[1] == ':' )
  142.     return dir;
  143.  
  144.     if ( crent_drive == NULL )
  145.     return dir;
  146.  
  147.     strcpy(tmp,crent_drive);
  148.     strcat(tmp,dir);
  149.     return tmp;
  150. }
  151. int    DB_init(char *file)
  152. {
  153.     int     i,n;
  154.     FILE    *fp;
  155.     PRGPTR  *pp=NULL;
  156.     KEYPTR  *kp,*tp;
  157.     char    *p,*s;
  158.     char    tmp[BUFSIZ];
  159.     char    key[BUFSIZ];
  160.  
  161.     int     pos, len;
  162.     char    buf[4096];
  163.  
  164.     prg_max = key_max = 0;
  165.  
  166.     if ( (fp = fopen(file,"rb")) == NULL )
  167.     return ERR;
  168.  
  169.     pos = len = 0;
  170.     for ( ; ; ) {
  171.     for ( i = 0 ; ; ) {
  172.         if ( pos >= len ) {
  173.             if ( (len = fread(buf, 1, 4096, fp)) <= 0 )
  174.                 goto ENDOF;
  175.             pos = 0;
  176.         }
  177.         n = buf[pos++];
  178.         if ( n == '\n' ) {
  179.         tmp[i] = '\0';
  180.         break;
  181.         } else if ( n != '\r' && n != '\x1A' )
  182.             tmp[i++] = n;
  183.     }
  184.  
  185. /**************************
  186.     while ( fgets(tmp,BUFSIZ,fp) != NULL ) {
  187.  
  188.     if ( (p = strchr(tmp,'\n')) != NULL )
  189.         *p = '\0';
  190. ****************************/
  191.  
  192.     if ( tmp[0] == '\0' || tmp[0] == '#' )
  193.         continue;
  194.  
  195.     if ( strncmp(tmp,"DRIVE:",6) == 0 ) {
  196.         p = &(tmp[6]); while ( isspace(*p) ) p++;
  197.         if ( *p == '\0' )
  198.         continue;
  199.         crent_drive = strdup(p);
  200.         continue;
  201.     }
  202.  
  203.     if ( strncmp(tmp,"PROGRAM:",8) == 0 ) {
  204.         p = &(tmp[8]); while ( isspace(*p) ) p++;
  205.         if ( *p == '\0' )
  206.         continue;
  207.  
  208.         if ( (pp = (PRGPTR *)malloc(sizeof(PRGPTR))) == NULL )
  209.         break;
  210.  
  211.         pp->next = prg_top;
  212.         prg_top = pp;
  213.  
  214.         prg_max++;
  215.         pp->flg = pp->copycnt = pp->bits = 0;
  216.         pp->name = strdup(p);
  217.         pp->make = pp->readme = pp->manual = pp->dir = NULL;
  218.         continue;
  219.     }
  220.  
  221.     if ( strncmp(tmp,"KEYWORD:",8) == 0 ) {
  222.         p = &(tmp[8]);
  223.         while ( *p != '\0' ) {
  224.         while ( isspace(*p) ) p++;
  225.         for ( s = key ; !isspace(*p) && *p != '\0' ; )
  226.              *(s++) = *(p++);
  227.         *s = '\0';
  228.         if ( key[0] != '\0' )
  229.             key_set(key,pp);
  230.         }        
  231.         continue;
  232.     }
  233.  
  234.     if ( strncmp(tmp,"GROUP:",6) == 0 ) {
  235.         tp = NULL;
  236.         p = &(tmp[6]);
  237.         while ( *p != '\0' ) {
  238.         while ( isspace(*p) ) p++;
  239.         for ( s = key ; !isspace(*p) && *p != '\0' ; )
  240.              *(s++) = *(p++);
  241.         *s = '\0';
  242.         if ( key[0] != '\0' ) {
  243.             if ( tp == NULL ) {
  244.                 key_set(key,NULL);
  245.             tp = key_now;
  246.             } else {
  247.             if ( (kp = key_srch(key)) != NULL )
  248.                 kp->grop = tp;
  249.             }
  250.         }
  251.         }        
  252.         continue;
  253.     }
  254.  
  255.     if ( pp == NULL )
  256.         continue;
  257.  
  258.     if ( strncmp(tmp,"MAKE:",5) == 0 ) {
  259.         p = &(tmp[6]); while ( isspace(*p) ) p++;
  260.         if ( *p != '\0' )
  261.         pp->make = strdup(p);
  262.  
  263.     } else if ( strncmp(tmp,"README:",7) == 0 ) {
  264.         p = &(tmp[7]); while ( isspace(*p) ) p++;
  265.         if ( *p != '\0' )
  266.         pp->readme = strdup(chk_drv(p));
  267.  
  268.     } else if ( strncmp(tmp,"MANUAL:",7) == 0 ) {
  269.         p = &(tmp[7]); while ( isspace(*p) ) p++;
  270.         if ( *p != '\0' )
  271.         pp->manual = strdup(chk_drv(p));
  272.  
  273.     } else if ( strncmp(tmp,"COPY:",5) == 0 ) {
  274.         p = &(tmp[5]);
  275.         while ( *p != '\0' ) {
  276.         while ( isspace(*p) ) p++;
  277.         for ( s = key ; !isspace(*p) && *p != '\0' ; )
  278.              *(s++) = *(p++);
  279.         *s = '\0';
  280.         if ( key[0] != '\0' && pp->copycnt < 16 )
  281.             pp->copy[pp->copycnt++] = strdup(chk_drv(key));
  282.         }        
  283.  
  284.     } else if ( strncmp(tmp,"DIR:",4) == 0 ) {
  285.         p = &(tmp[4]); while ( isspace(*p) ) p++;
  286.         if ( *p != '\0' )
  287.         pp->dir = strdup(chk_drv(p));
  288.  
  289.     }
  290.  
  291.     }
  292.  
  293. ENDOF:
  294.     fclose(fp);
  295.  
  296. /***************************************************
  297.     for ( i = 0 ; i < 4 && i < key_max ; i++ ) {
  298.     kp = key_tbl[i];
  299.     do {
  300.         for ( n = 0 ; n < kp->cnt ; n++ )
  301.             kp->prog[n]->bits |= (1 << i);
  302.         kp = kp->over;
  303.         } while ( kp != NULL );
  304.     }
  305. *****************************************************/
  306.  
  307.     return FALSE;
  308. }
  309. void    PRG_alldisp(int ofs)
  310. {
  311.     int     i;
  312.     PRGPTR  *pp;
  313.  
  314.     prg_ofs = ofs;
  315.     i = 0;
  316.     for ( pp = prg_top ; prg_cnt > 0 && pp != NULL ; pp = pp->next ) {
  317.     if ( pp->flg >= prg_cnt ) {
  318.         if ( i >= ofs && (i - ofs) < PRG_MAX ) {
  319.         PRG_disp((i-ofs),pp->name,pp->make,pp->bits);
  320.         prg_tbl[i-ofs] = pp;
  321.         }
  322.         i++;
  323.     }
  324.     }
  325.     prg_hit = i;
  326.  
  327.     MENU_mask(BACK_NO,ofs > 0 ? ON:OFF);
  328.     MENU_mask(NEXT_NO,(i-ofs) > PRG_MAX ? ON:OFF);
  329.     MENU_mask(CLER_NO,prg_cnt > 0 ? ON:OFF);
  330.  
  331.     while ( i >= ofs && (i - ofs) < PRG_MAX ) {
  332.     PRG_disp((i - ofs),"","",0);
  333.     prg_tbl[i-ofs] = NULL;
  334.     i++;
  335.     }
  336.  
  337.     if ( prg_cnt == 0 )
  338.     MSG2_disp("%24s","");
  339.     else if ( prg_hit == 0 )
  340.     MSG2_disp("Not Found               ");
  341.     else
  342.     MSG2_disp("%3d Found               ",prg_hit);
  343. }
  344. void    KEY_clic(int no)
  345. {
  346.     int     i,cd;
  347.     KEYPTR  *kp;
  348.  
  349.     if ( no >= key_max )
  350.     return;
  351.  
  352.     kp = key_tbl[no];
  353.     if ( (kp->flg = (kp->flg == 0 ? 1:0)) == 0 ) {
  354.     cd = (-1);
  355.     } else {
  356.     cd = 1;
  357.     }
  358.  
  359.     KEY_disp(no);
  360.     prg_cnt += cd;
  361.     do {
  362.     for ( i = 0 ; i < kp->cnt ; i++ )
  363.         kp->prog[i]->flg += cd;
  364.     kp = kp->over;
  365.     } while ( kp != NULL );
  366.  
  367.     PRG_alldisp(0);
  368. }
  369. void    KEY_cler(void)
  370. {
  371.     int     i;
  372.     PRGPTR  *pp;
  373.  
  374.     for ( i = 0 ; i < key_max ; i++ ) {
  375.     if ( key_tbl[i]->flg != 0 ) {
  376.         key_tbl[i]->flg = 0;
  377.         KEY_disp(i);
  378.     }
  379.     }
  380.  
  381.     for ( pp = prg_top ; pp != NULL ; pp = pp->next )
  382.     pp->flg = 0;
  383.  
  384.     for ( i = 0 ; i < PRG_MAX ; i++ ) {
  385.     PRG_disp(i,"","",0);
  386.     prg_tbl[i] = NULL;
  387.     }
  388.  
  389.     prg_cnt = prg_hit = 0;
  390.  
  391.     MENU_mask(BACK_NO,OFF);
  392.     MENU_mask(NEXT_NO,OFF);
  393.     MENU_mask(CLER_NO,OFF);
  394.  
  395.     MSG2_disp("%24s","");
  396. }
  397. void    PRG_status(void)
  398. {
  399.     MENU_mask(BACK_NO,prg_ofs > 0 ? ON:OFF);
  400.     MENU_mask(NEXT_NO,(prg_hit - prg_ofs) > PRG_MAX ? ON:OFF);
  401.     MENU_mask(CLER_NO,prg_cnt > 0 ? ON:OFF);
  402. }
  403. void    PRG_back(void)
  404. {
  405.     if ( prg_ofs <= 0 )
  406.     return;
  407.     PRG_alldisp(prg_ofs - PRG_MAX);
  408. }
  409. void    PRG_next(void)
  410. {
  411.     if ( (prg_ofs + PRG_MAX) >= prg_hit )
  412.     return;
  413.     PRG_alldisp(prg_ofs + PRG_MAX);
  414. }
  415.  
  416. /*************************************************************
  417. 01234567890123456789012345678901234567890123456789012345678901234567890123456789                01234567890123456789012345678901234567890123456
  418.                 +---------------------------------------------+
  419.                 | PROGRAM  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | 
  420.                 | MAKE     xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
  421.                 | KEYWORD  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
  422.                 | COPY     xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
  423.                 | README   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
  424.                 | MANUAL   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
  425.                 | DIR      xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
  426.                 |             | 設  定 | | 終  了 |           |
  427.                 +---------------------------------------------+
  428. **************************************************************/
  429.  
  430. extern char    index_file[];
  431. extern int    cut_mode;
  432. extern char    cut_buf[2][128];
  433.  
  434. #define    FILE_IDX    index_file
  435.  
  436. #define    FSEL_X1        (5*8)
  437. #define    FSEL_Y1        (250)
  438. #define    FSEL_X2        (75*8)
  439. #define    FSEL_Y2        (FSEL_Y1+200)
  440.  
  441. #define    FSEL_PROG_X    (FSEL_X1+11*8)
  442. #define    FSEL_PROG_Y    (FSEL_Y1+4)
  443.  
  444. #define    FSEL_MAKE_X    (FSEL_X1+11*8)
  445. #define    FSEL_MAKE_Y    (FSEL_Y1+1*24+4)
  446.  
  447. #define    FSEL_KEYW_X    (FSEL_X1+11*8)
  448. #define    FSEL_KEYW_Y    (FSEL_Y1+2*24+4)
  449.  
  450. #define    FSEL_COPY_X    (FSEL_X1+11*8)
  451. #define    FSEL_COPY_Y    (FSEL_Y1+3*24+4)
  452.  
  453. #define    FSEL_READ_X    (FSEL_X1+11*8)
  454. #define    FSEL_READ_Y    (FSEL_Y1+4*24+4)
  455.  
  456. #define    FSEL_MANU_X    (FSEL_X1+11*8)
  457. #define    FSEL_MANU_Y    (FSEL_Y1+5*24+4)
  458.  
  459. #define    FSEL_DIR_X    (FSEL_X1+11*8)
  460. #define    FSEL_DIR_Y    (FSEL_Y1+6*24+4)
  461.  
  462. #define    FSEL_EXT_X    ((FSEL_X1+FSEL_X2)/2-22*8)
  463. #define    FSEL_EXT_Y    (FSEL_Y1+7*24+4)
  464.  
  465. #define    FSEL_YES_X    ((FSEL_X1+FSEL_X2)/2-10*8)
  466. #define    FSEL_YES_Y    (FSEL_Y1+7*24+4)
  467.  
  468. #define    FSEL_RET_X    ((FSEL_X1+FSEL_X2)/2+2*8)
  469. #define    FSEL_RET_Y    (FSEL_Y1+7*24+4)
  470.  
  471. #define LIST_X          (17*8)
  472. #define LIST_Y          26
  473. #define LIST_M          "マニュアル表示"
  474. #define    LIST_X1            (LIST_X-4)
  475. #define    LIST_Y1            (LIST_Y-2)
  476. #define    LIST_X2            (LIST_X+14*8+3)
  477. #define    LIST_Y2            (LIST_Y+17)
  478.  
  479. #define KEY_X           8
  480. #define KEY_Y           69
  481. #define KEY_L            (18*8)
  482. #define KEY_S            (20*8)
  483. #define KEY_POS_X(n)    ((n%4)*KEY_S+KEY_X)
  484. #define KEY_POS_Y(n)    ((n/4)*24+KEY_Y)
  485.  
  486. void    eof_chk(FILE *fp)
  487. {
  488.     int     ch;
  489.  
  490.     _setmode(fp,_BINARY);
  491.     fseek(fp,(-50L),SEEK_END);
  492.     while ( (ch = getc(fp)) != EOF && ch != 0x1A );
  493.     if ( ch == 0x1A ) {
  494.     fseek(fp,(-1L),SEEK_CUR);
  495.     } else {
  496.     clearerr(fp);
  497.     fseek(fp,0L,SEEK_END);
  498.     }
  499.     _setmode(fp,_TEXT);
  500. }
  501.  
  502. void    KEY_input(void)
  503. {
  504.     int     i,n,j;
  505.     int     sw,bx,by;
  506.     FILE    *fp;
  507.     BLOCK   *sp;
  508.     EVENT   *ep=NULL;
  509.     PRGPTR  *pp;
  510.     char    *p,*s;
  511.     char    tmp[256];
  512.     char    key[BUFSIZ];
  513.     static char dmy[7][BUFSIZ];
  514.  
  515.     if ( (fp = fopen(FILE_IDX,"r+")) == NULL ) {
  516.     if ( (fp = fopen(FILE_IDX,"w")) == NULL )
  517.         return;
  518.     } else
  519.     eof_chk(fp);
  520.  
  521.     dmy[0][0] = dmy[1][0] = dmy[2][0] = dmy[3][0] = 
  522.     dmy[4][0] = dmy[5][0] = dmy[6][0] = '\0';
  523.  
  524.     MOS_disp(OFF);
  525.     sp = DSP_push_vram(FSEL_X1,FSEL_Y1,FSEL_X2,FSEL_Y2);
  526.     DSP_opbox(FSEL_X1,FSEL_Y1,FSEL_X2,FSEL_Y2);
  527.     DSP_wbox(FSEL_X1,FSEL_Y1,FSEL_X2,FSEL_Y2,LINE_COL,MENU_COL,M_PSET);
  528.  
  529.     ep = EVT_set(ep,500,LIST_X1,LIST_Y1,LIST_X2,LIST_Y2,EVT_proc);
  530.  
  531.     for ( i = 0 ; i < 28 ; i++ ) {
  532.     ep = EVT_set(ep,i+300,
  533.          KEY_POS_X(i)-4,KEY_POS_Y(i)-2,
  534.          KEY_POS_X(i)+KEY_L+3,KEY_POS_Y(i)+17,EVT_proc);
  535.     }
  536.  
  537.     sprintf(tmp,"%-44.44s",dmy[0]);
  538.     ep = EVT_sw(ep,0,FSEL_PROG_X,FSEL_PROG_Y,CHR_COL,WIND_COL,tmp);
  539.     sprintf(tmp,"%-31.31s",dmy[1]);
  540.     ep = EVT_sw(ep,1,FSEL_MAKE_X,FSEL_MAKE_Y,CHR_COL,WIND_COL,tmp);
  541.     sprintf(tmp,"%-58.58s",dmy[2]);
  542.     ep = EVT_sw(ep,2,FSEL_KEYW_X,FSEL_KEYW_Y,CHR_COL,WIND_COL,tmp);
  543.     sprintf(tmp,"%-58.58s",dmy[3]);
  544.     ep = EVT_sw(ep,3,FSEL_COPY_X,FSEL_COPY_Y,CHR_COL,WIND_COL,tmp);
  545.     sprintf(tmp,"%-58.58s",dmy[4]);
  546.     ep = EVT_sw(ep,4,FSEL_READ_X,FSEL_READ_Y,CHR_COL,WIND_COL,tmp);
  547.     sprintf(tmp,"%-58.58s",dmy[5]);
  548.     ep = EVT_sw(ep,5,FSEL_MANU_X,FSEL_MANU_Y,CHR_COL,WIND_COL,tmp);
  549.     sprintf(tmp,"%-58.58s",dmy[6]);
  550.     ep = EVT_sw(ep,6,FSEL_DIR_X,FSEL_DIR_Y,CHR_COL,WIND_COL,tmp);
  551.  
  552.     ep = EVT_sw(ep,10,FSEL_X1+8,FSEL_PROG_Y,CHR_COL,KEY_COL,"PROGRAM");
  553.     ep = EVT_sw(ep,11,FSEL_X1+8,FSEL_MAKE_Y,CHR_COL,KEY_COL,"MAKE   ");
  554.     ep = EVT_sw(ep,12,FSEL_X1+8,FSEL_KEYW_Y,CHR_COL,KEY_COL,"KEYWORD");
  555.     ep = EVT_sw(ep,13,FSEL_X1+8,FSEL_COPY_Y,CHR_COL,KEY_COL,"COPY   ");
  556.     ep = EVT_sw(ep,14,FSEL_X1+8,FSEL_READ_Y,CHR_COL,KEY_COL,"README ");
  557.     ep = EVT_sw(ep,15,FSEL_X1+8,FSEL_MANU_Y,CHR_COL,KEY_COL,"MANUAL ");
  558.     ep = EVT_sw(ep,16,FSEL_X1+8,FSEL_DIR_Y, CHR_COL,KEY_COL,"DIR    ");
  559.  
  560.     ep = EVT_sw(ep,110,FSEL_EXT_X,FSEL_EXT_Y,CHR_COL,WIND_COL," 簡  単 ");
  561.     ep = EVT_sw(ep,100,FSEL_YES_X,FSEL_YES_Y,CHR_COL,WIND_COL," 設  定 ");
  562.     ep = EVT_sw(ep,200,FSEL_RET_X,FSEL_RET_Y,CHR_COL,WIND_COL," もどる ");
  563.  
  564.     MOS_rdpos(&sw,&bx,&by);
  565.     MOS_setpos((FSEL_X1+FSEL_X2)/2,(FSEL_Y1+FSEL_Y2)/2);
  566.     MOS_disp(ON);
  567.  
  568.     for ( ; ; ) {
  569.     i = EVT_wait(ep);
  570.  
  571.     if ( i == 0 ) {
  572.         MOS_disp(OFF);
  573.         input(FSEL_PROG_X,FSEL_PROG_Y+i*24,44,dmy[i]);
  574.         MOS_disp(ON);
  575.  
  576.     } else if ( i == 1 ) {
  577.         MOS_disp(OFF);
  578.         input(FSEL_PROG_X,FSEL_PROG_Y+i*24,31,dmy[i]);
  579.         MOS_disp(ON);
  580.  
  581.     } else if ( i >= 2 && i <= 6 ) {
  582.         MOS_disp(OFF);
  583.         input(FSEL_PROG_X,FSEL_PROG_Y+i*24,58,dmy[i]);
  584.         MOS_disp(ON);
  585.  
  586.     } else if ( i >= 10 && i <= 11 ) {
  587.         if ( (p = FILE_select()) != NULL ) {
  588.         MENU_mask(RETN_NO,ON);
  589.         cut_mode = TRUE;
  590.         cut_buf[0][0] = '\0';
  591.         FILE_open(p);
  592.         while ( MENU_no(0) != CLER_NO )
  593.             FILE_irq();
  594.         MENU_mask(CLER_NO,OFF);
  595.         FILE_close();
  596.         cut_mode = FALSE;
  597.  
  598.         n = i - 10;
  599.         strcat(dmy[n],cut_buf[0]);
  600.  
  601.         MOS_disp(OFF);
  602.         gprintf(FSEL_PROG_X,FSEL_PROG_Y+n*24,
  603.             CHR_COL,WIND_COL,
  604.              n == 0 ? "%-44.44s":
  605.             (n == 1 ? "%-31.31s":
  606.                   "%-58.58s"),dmy[n]);
  607.         MOS_disp(ON);
  608.         }
  609.  
  610.     } else if ( i == 110 ) {
  611.         if ( (p = FILE_select()) != NULL ) {
  612.         MENU_mask(RETN_NO,ON);
  613.         cut_mode = TRUE;
  614.         cut_buf[0][0] = cut_buf[1][0] = '\0';
  615.         FILE_open(p);
  616.         while ( (n = MENU_no(0)) != CLER_NO ) {
  617.             FILE_irq();
  618.             if ( n == BACK_NO )
  619.             FILE_back();
  620.             else if ( n == NEXT_NO )
  621.             FILE_next();
  622.         }
  623.         MENU_mask(CLER_NO,OFF);
  624.         FILE_close();
  625.         cut_mode = FALSE;
  626.  
  627.         strcpy(dmy[0],cut_buf[0]);
  628.         strcpy(dmy[1],cut_buf[1]);
  629.         getdir(dmy[6]);
  630.  
  631.         MOS_disp(OFF);
  632.         gprintf(FSEL_PROG_X,FSEL_PROG_Y,
  633.             CHR_COL,WIND_COL,"%-44.44s",dmy[0]);
  634.         gprintf(FSEL_MAKE_X,FSEL_MAKE_Y,
  635.             CHR_COL,WIND_COL,"%-31.31s",dmy[1]);
  636.             CHR_COL,WIND_COL,
  637.         gprintf(FSEL_DIR_X,FSEL_DIR_Y,
  638.             CHR_COL,WIND_COL,"%-58.58s",dmy[6]);
  639.             MOS_disp(ON);
  640.         }
  641.  
  642.     } else if ( i >= 13 && i <= 15 ) {
  643.         if ( (p = FILE_select()) != NULL ) {
  644. /********************************************
  645.         tmp[0] = 'A' + getdrv();
  646.         tmp[1] = ':';
  647.         getdir(tmp+2);
  648.         if ( tmp[3] != '\0' )
  649.             strcat(tmp,"\\");
  650.         strcat(tmp,p);
  651. *********************************************/
  652.         getdir(tmp);
  653.         if ( tmp[1] != '\0' )
  654.             strcat(tmp,"\\");
  655.         strcat(tmp,p);
  656.  
  657.         n = i - 10;
  658.         if ( dmy[n][0] != '\0' )
  659.             strcat(dmy[n]," ");
  660.         strcat(dmy[n],tmp);
  661.  
  662.         MOS_disp(OFF);
  663.         gprintf(FSEL_PROG_X,FSEL_PROG_Y+n*24,
  664.                 CHR_COL,WIND_COL,"%-58.58s",dmy[n]);
  665.             MOS_disp(ON);
  666.         }
  667.  
  668.     } else if ( i == 16 ) {
  669.         FILE_select();
  670. /*******************************************
  671.         tmp[0] = 'A' + getdrv();
  672.         tmp[1] = ':';
  673.         getdir(tmp+2);
  674. *******************************************/
  675.         getdir(tmp);
  676.  
  677.         n = i - 10;
  678.         strcpy(dmy[n],tmp);
  679.  
  680.         MOS_disp(OFF);
  681.         gprintf(FSEL_PROG_X,FSEL_PROG_Y+n*24,
  682.             CHR_COL,WIND_COL,"%-58.58s",dmy[n]);
  683.         MOS_disp(ON);
  684.  
  685.     } else if ( i == 500 ) {
  686.         LIST_proc();
  687.  
  688.     } else if ( i >= 300 ) {
  689.         if ( key_tbl[i-300] != NULL ) {
  690.         if ( dmy[2][0] != '\0' )
  691.             strcat(dmy[2]," ");
  692.         strcat(dmy[2],key_tbl[i-300]->key);
  693.         MOS_disp(OFF);
  694.         gprintf(FSEL_KEYW_X,FSEL_KEYW_Y,
  695.                 CHR_COL,WIND_COL,"%-58.58s",dmy[2]);
  696.         MOS_disp(ON);
  697.         }
  698.  
  699.     } else if ( i == 100 ) {
  700.         if ( dmy[0][0] == '\0' &&
  701.         yesno("作品名が無いけど?") == ERR )
  702.         continue;
  703.         if ( dmy[1][0] == '\0' &&
  704.         yesno("作者名が無いけど?") == ERR )
  705.         continue;
  706.         if ( dmy[2][0] == '\0' &&
  707.         yesno("キ-ワ-ドが無いけど?") == ERR )
  708.         continue;
  709.         if ( dmy[3][0] == '\0' && dmy[4][0] == '\0' &&
  710.              dmy[5][0] == '\0' && dmy[6][0] == '\0' &&
  711.         yesno("ファイル指定が無いけど?") == ERR )
  712.         continue;
  713.  
  714.         fprintf(fp,"\n");
  715.         fprintf(fp,"PROGRAM: %s\n",dmy[0]);
  716.         fprintf(fp,"MAKE:    %s\n",dmy[1]);
  717.         fprintf(fp,"KEYWORD: %s\n",dmy[2]);
  718.         if ( dmy[3][0] != '\0' )
  719.         fprintf(fp,"COPY:    %s\n",dmy[3]);
  720.         if ( dmy[4][0] != '\0' )
  721.         fprintf(fp,"README:  %s\n",dmy[4]);
  722.         if ( dmy[5][0] != '\0' )
  723.         fprintf(fp,"MANUAL:  %s\n",dmy[5]);
  724.         if ( dmy[6][0] != '\0' )
  725.         fprintf(fp,"DIR:     %s\n",dmy[6]);
  726.  
  727.         if ( (pp = (PRGPTR *)malloc(sizeof(PRGPTR))) == NULL )
  728.         break;
  729.         pp->next = prg_top;
  730.         prg_top = pp;
  731.         prg_max++;
  732.         pp->flg = pp->copycnt = pp->bits = 0;
  733.         pp->name = strdup(dmy[0]);
  734.         pp->make = pp->readme = pp->manual = pp->dir = NULL;
  735.  
  736.         if ( dmy[1][0] != '\0' )
  737.         pp->make = strdup(dmy[1]);
  738.         if ( dmy[4][0] != '\0' )
  739.         pp->readme = strdup(chk_drv(dmy[4]));
  740.         if ( dmy[5][0] != '\0' )
  741.         pp->manual = strdup(chk_drv(dmy[5]));
  742.         if ( dmy[6][0] != '\0' )
  743.         pp->dir    = strdup(chk_drv(dmy[6]));
  744.  
  745.         p = dmy[3];
  746.         while ( *p != '\0' ) {
  747.         while ( isspace(*p) ) p++;
  748.         for ( s = key ; !isspace(*p) && *p != '\0' ; )
  749.              *(s++) = *(p++);
  750.         *s = '\0';
  751.         if ( key[0] != '\0' && pp->copycnt < 16 )
  752.             pp->copy[pp->copycnt++] = strdup(chk_drv(key));
  753.         }        
  754.  
  755.         p = dmy[2];
  756.         while ( *p != '\0' ) {
  757.         while ( isspace(*p) ) p++;
  758.         for ( s = key ; !isspace(*p) && *p != '\0' ; )
  759.              *(s++) = *(p++);
  760.         *s = '\0';
  761.         if ( key[0] != '\0' )
  762.             key_set(key,pp);
  763.         }        
  764.  
  765.         dmy[0][0] = dmy[1][0] = dmy[2][0] = dmy[3][0] = 
  766.         dmy[4][0] = dmy[5][0] = dmy[6][0] = '\0';
  767.  
  768.         MOS_disp(OFF);
  769.         gprintf(FSEL_PROG_X,FSEL_PROG_Y,
  770.             CHR_COL,WIND_COL,"%-44.44s",dmy[0]);
  771.         gprintf(FSEL_MAKE_X,FSEL_MAKE_Y,
  772.             CHR_COL,WIND_COL,"%-31.31s",dmy[1]);
  773.         gprintf(FSEL_KEYW_X,FSEL_KEYW_Y,
  774.             CHR_COL,WIND_COL,"%-58.58s",dmy[2]);
  775.         gprintf(FSEL_COPY_X,FSEL_COPY_Y,
  776.             CHR_COL,WIND_COL,"%-58.58s",dmy[3]);
  777.         gprintf(FSEL_READ_X,FSEL_READ_Y,
  778.             CHR_COL,WIND_COL,"%-58.58s",dmy[4]);
  779.         gprintf(FSEL_MANU_X,FSEL_MANU_Y,
  780.             CHR_COL,WIND_COL,"%-58.58s",dmy[5]);
  781.         gprintf(FSEL_DIR_X,FSEL_DIR_Y,
  782.             CHR_COL,WIND_COL,"%-58.58s",dmy[6]);
  783.         MOS_disp(ON);
  784.  
  785.     } else if ( i == 200 ) {
  786.         break;
  787.     }
  788.     }
  789.  
  790.     EVT_free(ep);
  791.     MOS_disp(OFF);
  792.     DSP_pop_vram(sp);
  793.     MOS_setpos(bx,by);
  794.     MOS_disp(ON);
  795.     fclose(fp);
  796. }
  797.